#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行，
# 第2行注释表示.py文件本身使用标准UTF-8编码：
print('#############记录错误：使用logging模块可以很容易记录错误信息#############')
import logging


def foo(s):
    return int(s)


def bar(s):
    return foo(s) * 2


def main(s):
    try:
        bar(s)
    except Exception as e:
        logging.exception(e)


main(0)
print('#############通过配置，logging还可以把错误记录到日志文件里，方便事后排查。#############')
print("end")
print('#############抛出错误，自定义异常#############')


# 第一步：如果要抛出错误，首先根据需要，可以定义一个错误的class，
# 选择好继承关系，然后，用raise语句抛出一个错误的实例：
class FoolError(ValueError):
    pass


def foo(s):
    n = int(s)
    if n == 0:
        raise FoolError("自定义异常！ value is error %s" % n)
    return 10 / n


foo(1)


# raise语句如果不带参数，就会把当前错误原样抛出。此外，在except中raise一个Error，
# 还可以把一种类型的错误转化成另一种类型：
def bar():
    try:
        foo(1)
    except ValueError as e:
        print('value error')
        raise TypeError("type error")


bar()
print('#############运行下面的代码，根据异常信息进行分析，定位出错误源头，并修复#############')
from functools import reduce


def str2num(s):
    return float(s)


def calc(exp):
    ss = exp.split('+')
    ns = map(str2num, ss)
    return reduce(lambda acc, x: acc + x, ns)


def main():
    r = calc('100 + 200 + 345')
    print('100 + 200 + 345 =', r)
    r = calc('99 + 88 + 7.6')
    print('99 + 88 + 7.6 =', r)


main()
